package com.black.opencvStudy;

import org.junit.Test;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * @description：
 * 图像的几何变幻
 * @author：8568
 */
public class Demo7 extends OpencvEV {

    private static Mat img = Imgcodecs.imread("src/main/resources/img/img.jpg");

    /**
     * 缩放
     * 插值： https://www.cnblogs.com/laozhanghahaha/p/12580822.html
    */
    @Test
    public void reSize() {
        showImg(img, "原图");
        Mat dest1 = new Mat();
        // 简单的缩放
        Imgproc.resize(img, dest1, new Size(600, 600));
        showImg(dest1, "简单的缩放");
        // 插值缩放
        Mat result2 = new Mat();
        Imgproc.resize(
                // 原图
                dest1,
                // 输出图像
                result2,
                // 大小
                new Size(900, 600),
                // 水平和纵向缩放因子
                2, 2,
                // 插值方法
                Imgproc.INTER_LINEAR);
        showImg(result2, "插值缩放");
    }

    /**
     * 图像的平移
     * @see https://blog.csdn.net/guduruyu/article/details/70799804
     * 这里我明白了文档上的 M  = np.float32([[1,0,100],[0,1,50]])就是指定矩阵每个元素来创建CvType.CV_32FC1的矩阵
    */
    @Test
    public void warpAffine() {
        showImg(img, "原图片");
        // 定义平移变换矩阵 (设定水平平移100像素， 纵向平移50像素)
        Mat M = Mat.zeros(2, 3, CvType.CV_32FC1);
        // 矩阵对角线设置为1
        for (int i = 0; i < M.cols(); i ++) {
            M.put(i, i, new float[]{1});
        }
        // 设置水平平移量
        M.put(0, 2, new float[]{100});
        M.put(1, 2, new float[]{50});
        Mat dst = new Mat();
        Imgproc.warpAffine(img, dst, M, img.size());
        showImg(dst, "平移后的图片");
    }

}
